#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
一键启动工作台系统
"""

import subprocess
import sys
import os
import time
import webbrowser
from pathlib import Path

def print_banner():
    """打印启动横幅"""
    print("=" * 60)
    print("  n8n工作流监控系统 - 工作台启动")
    print("=" * 60)
    print()

def check_dependencies():
    """检查依赖"""
    print("[1/4] 检查依赖...")
    required_modules = ['pymysql', 'requests']
    missing = []
    
    for module in required_modules:
        try:
            __import__(module)
        except ImportError:
            missing.append(module)
    
    if missing:
        print(f"[WARNING] 缺少依赖: {', '.join(missing)}")
        print("[INFO] 正在安装依赖...")
        subprocess.run([sys.executable, '-m', 'pip', 'install'] + missing, check=True)
        print("[SUCCESS] 依赖安装完成")
    else:
        print("[SUCCESS] 依赖检查通过")
    print()

def generate_report():
    """生成监控报告"""
    print("[2/4] 生成监控报告...")
    try:
        # 检查report文件是否存在
        report_file = Path('static/monitor_report.json')
        if report_file.exists():
            print("[INFO] 发现现有报告文件，使用现有数据")
            print("[SUCCESS] 监控报告准备就绪")
            print()
            return True
        
        # 生成新报告
        result = subprocess.run([sys.executable, 'monitor.py'], 
                              capture_output=False, timeout=60,
                              cwd=os.getcwd())
        if result.returncode == 0:
            print("[SUCCESS] 监控报告生成成功")
        else:
            print(f"[WARNING] 监控报告生成有警告，但继续运行")
        print()
        return True
    except subprocess.TimeoutExpired:
        print("[ERROR] 监控报告生成超时")
        return False
    except Exception as e:
        print(f"[ERROR] 监控报告生成失败: {e}")
        return False

def start_web_server():
    """启动Web服务器"""
    print("[3/4] 启动Web服务器...")
    try:
        # 启动Web服务器，实时输出日志到控制台
        process = subprocess.Popen([sys.executable, 'start_server.py'],
                                  stdout=None,  # 实时输出到控制台
                                  stderr=subprocess.STDOUT,  # 将stderr重定向到stdout
                                  bufsize=1,  # 行缓冲，确保实时输出
                                  universal_newlines=True)
        
        # 等待服务器启动
        time.sleep(3)
        
        # 检查服务器是否还在运行
        if process.poll() is None:
            print("[SUCCESS] Web服务器启动成功")
            print()
            print("=" * 60)
            print("  [实时日志] 所有服务器日志将实时显示在下方")
            print("=" * 60)
            print()
            return process
        else:
            print("[ERROR] Web服务器启动失败")
            return None
    except Exception as e:
        print(f"[ERROR] Web服务器启动异常: {e}")
        return None

def open_browser():
    """打开浏览器"""
    print("[4/4] 打开工作台...")
    time.sleep(2)
    try:
        webbrowser.open('http://localhost:8001/index.html')
        print("[SUCCESS] 工作台已在浏览器中打开")
        print()
    except Exception as e:
        print(f"[WARNING] 无法自动打开浏览器: {e}")
        print("[INFO] 请手动访问: http://localhost:8001/index.html")
        print()

def main():
    """主函数"""
    print_banner()
    
    # 检查依赖
    check_dependencies()
    
    # 生成报告
    if not generate_report():
        print("[WARNING] 报告生成失败，但继续启动...")
        print()
    
    # 启动Web服务器
    process = start_web_server()
    if not process:
        print("[ERROR] 系统启动失败")
        return 1
    
    # 打开浏览器
    open_browser()
    
    # 显示信息
    print("=" * 60)
    print("  工作台已就绪")
    print("=" * 60)
    print()
    print("[访问地址]")
    print("   主页面: http://localhost:8001/index.html")
    print("   薪资详情: http://localhost:8001/salary_detail.html")
    print()
    print("[使用说明]")
    print("   1. 主页面可以看到整体统计")
    print("   2. 点击薪资统计卡片进入详情页")
    print("   3. 点击开始评估按钮进行AI评估")
    print("   4. 评估完成后可查看用户列表或消息分类")
    print()
    print("[提示] 按 Ctrl+C 停止服务器")
    print("=" * 60)
    print()
    
    try:
        # 保持进程运行
        process.wait()
    except KeyboardInterrupt:
        print("\n[INFO] 正在停止服务器...")
        process.terminate()
        process.wait()
        print("[SUCCESS] 服务器已停止")
        return 0

if __name__ == '__main__':
    sys.exit(main())

